package com.guoj.webmagic.wm;

import com.guoj.webmagic.wm.pipeline.LianjiaPipeline;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

import java.util.List;

/**
 * @作者: guoj
 * @日期: 2019/6/4 17:03
 * @描述: 抓取房源的processor
 * 		  --- 抓取的是：https://xy.lianjia.com/zufang/
 */
public class LianjiaPageProcessor implements PageProcessor {

	private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000);

	@Override
	public void process(Page page) {

		Html html = page.getHtml();
		// 使用css选择器，获取房源列表页中要爬取的链接，以list形式放入page。
		List<String> list = html.css(".content__list--item--title a").links().all();
		page.addTargetRequests(list);
		// 表示：class="content clear w1150"的div下面的p标签的text文本
		page.putField("title", html.xpath("//div[@class='content clear w1150']/p/text()").toString());
		page.putField("rent", html.xpath("//p[@class='content__aside--title']/span/text()").toString());
		page.putField("type", html.xpath("//p[@class='content__article__table']/allText()").toString());
		page.putField("info", html.xpath("//div[@class='content__article__info']/allText()").toString());
		page.putField("img", html.xpath("//div[@class='content__article__slide__item']/img").toString());

		// 如果获取title的值是null，说明是房源列表页，那么就跳过列表页。
		if (page.getResultItems().get("title") == null) {
			// 跳过
			page.setSkip(true);
			// 链家房源默认最多显示100页，直接循环处理每一页。
			// 把100个详情页都放入page，这样处理器会继续抓取这些详情页的内容。
			for (int i = 1; i <= 100; i++) {
				page.addTargetRequest("https://xy.lianjia.com/zufang/pg" + i);
			}
		}

	}

	@Override
	public Site getSite() {
		return site;
	}

	public static void main(String[] args) {
		// 调试阶段开1个线程，执行阶段可以开多个。
		Spider.create(new LianjiaPageProcessor())
				.addUrl("https://xy.lianjia.com/zufang")
				.thread(5)
				.addPipeline(new LianjiaPipeline()) // 添加一个管道
				.run();
	}
}
